package _03_recursion;

import org.junit.Test;

import java.util.Arrays;

/**
 * @author: mornd
 * @dateTime: 2023/6/1 - 2:26
 * 递归实现冒泡排序
 */
public class BubbleSort {
    @Test
    public void test() {
//        int[] arr = {8, 1, 7, 3, 11, 4, 6, 5};
        int[] arr = {1, 2, 3, 5, 4};
        bubble2(arr);
        System.out.println(Arrays.toString(arr));
    }

    void bubble(int[] arr) {
        foo(arr, arr.length - 1);
    }

    /**
     * @param arr 数组
     * @param j 查找的元素
     */
    void foo(int[] arr, int j) {
        if (j == 0) {
            return;
        }
        // 保证如果数组已经有序，提前退出递归
        int x = 0;
        for (int i = 0; i < j; i++) {
            if (arr[i] > arr[i + 1]) {
                int t = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = t;
                x = i;
            }
        }
        foo(arr, x);
    }

    // 普通冒泡排序
    void bubble2(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            // 如果数组已经有序了，结束循环，提升效率
            boolean swapped = false;
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int t = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = t;
                    swapped = true;
                }
            }
            if (!swapped) {
                break;
            }
        }
    }
}
